package com.qdh.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qdh.model.Product;
import com.qdh.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

//product/findAll?page=1&size=5
@Controller
@RequestMapping("product")
public class ProductController {
    @Autowired
    private ProductService productService;
    @RequestMapping("findAll")
    public String findAll(@RequestParam(name = "page",defaultValue = "1") Integer page
                        , @RequestParam(name = "size",defaultValue = "5") Integer size
                        , Model model) {
        PageHelper.startPage(page,size);
        List<Product> list = productService.findAll();
        PageInfo pageInfo = new PageInfo(list);
        model.addAttribute("pageInfo",pageInfo);
        return "product-list";
    }
    //product/save
    @RequestMapping("save")
    public String save(Product product) {
        productService.insertProduct(product);
        return "redirect:/product/findAll";
    }
    //product/editById?id=31
    @RequestMapping("editById")
    public String editById(@RequestParam Integer id, Model model) {
        Product product = productService.findById(id);
        model.addAttribute("product",product);
        return "product-edit";
    }
    //product/edit
    @RequestMapping("edit")
    public String edit(Product product) {
        productService.updateProduct(product);
        return "redirect:/product/findAll";
    }
//product/findById?id=26
    @RequestMapping("findById")
    public String findById(@RequestParam Integer id, Model model) {
        Product product = productService.findById(id);
        model.addAttribute("product",product);
        return "product-show";
    }
//product/deleteById?id=3
    @RequestMapping("deleteById")
    public String deleteById(@RequestParam Integer id) {
        productService.deleteProduct(id);
        return "redirect:/product/findAll";
    }
    /*
    * type: "post",
      url: "/product/selectDelete",
      data: {"ids": arr.toString()},
    * */
    @RequestMapping("selectDelete")
    public String selectDelete(String[] ids) {
        for (String id : ids) {
            productService.deleteProduct(Integer.parseInt(id));
        }
        return "redirect:/product/findAll";
    }
}
/*
*  PageHelper 初始化分页参数
java
PageHelper.startPage(page, size);

线程绑定分页参数：PageHelper 使用 ThreadLocal 存储当前线程的分页参数（页码 page 和每页大小 size）。
拦截器准备：后续的 SQL 查询会被 PageInterceptor 拦截，该拦截器是 PageHelper 的核心组件。
2. 执行数据库查询
java
List<Product> list = productService.findAll();

SQL 拦截：当执行 findAll() 方法时，PageInterceptor 会拦截该查询。
生成分页 SQL：
物理分页：根据数据库类型（如 MySQL、Oracle）自动生成带 LIMIT/OFFSET 或 ROWNUM 的分页 SQL。
示例（MySQL）：
sql
SELECT * FROM product LIMIT ? OFFSET ?

执行两次查询：
总记录数查询：自动执行 SELECT COUNT(*) FROM product 获取总记录数。
分页数据查询：执行带 LIMIT/OFFSET 的原始 SQL。
3. 封装分页结果
java
PageInfo pageInfo = new PageInfo(list);

PageInfo 构造函数会解析查询结果并填充以下核心属性：

基础分页参数：
pageNum：当前页码（从 PageHelper 获取）。
pageSize：每页大小（从 PageHelper 获取）。
total：总记录数（第一次 COUNT 查询的结果）。
pages：总页数（total / pageSize 向上取整）。
当前页数据：
list：实际查询结果列表（第二次分页查询的结果）。
导航辅助信息：
hasPreviousPage/hasNextPage：是否有上 / 下一页。
navigatepageNums：导航页码列表（如 [1,2,3,4,5]）。
4. 清除 ThreadLocal 状态
PageHelper 会在查询结束后自动清除当前线程的分页参数，避免对后续查询造成影响。
完整执行流程图
plaintext
用户代码：
PageHelper.startPage(page, size)
    ↓
[ThreadLocal] 存储分页参数 (page=2, size=10)
    ↓
执行 productService.findAll()
    ↓
[PageInterceptor 拦截]
    ↓
[执行 COUNT 查询]
    → SELECT COUNT(*) FROM product → 结果：105 条
    ↓
[生成分页 SQL]
    → SELECT * FROM product LIMIT 10 OFFSET 10
    ↓
[执行分页查询]
    → 返回第 2 页的 10 条数据
    ↓
创建 PageInfo 对象：
    - pageNum=2
    - pageSize=10
    - total=105
    - pages=11
    - list=[Product1, Product2, ..., Product10]
    - hasPreviousPage=true
    - hasNextPage=true
    - navigatepageNums=[1,2,3,4,5]
    ↓
[清除 ThreadLocal]
* */